/**
 * 安卓白金英雄坛制作组 <br>
 * 文件名：ItemRoom.java <br>
 * 创建时间：2014-1-15 上午10:05:27 <br>
 * 所属项目：GmudEX <br>
 *
 * @author 12548 <br>
 */
package lostland.gmud.exv2.data;

import android.util.SparseArray;

import lostland.gmud.exv2.Game;
import lostland.gmud.exv2.GameConstants;
import lostland.gmud.exv2.Gmud;

/**
 * 类名：Room <br>
 * 说明：初始化和动态信息加载
 *
 * @author 12548
 */
public class Room {

	/**
	 *
	 */
	public static final int SHUI_TONG = 88;

// public static int vip_npc[] = new int[10];

	// 0: npc_12548; 1: npc_smgs;
// public static int super_toys[] = new int[10];
	// 十玩具 钟剑斧壶塔 琴鼎印镜石(12345,67890)

	public ItemTemplateGenerator item(int id) {
		return new ItemTemplateGenerator(id);
	}

	public ItemTemplateGenerator item() {
		return new ItemTemplateGenerator();
	}

	public static final int ITMTYPE_FOOD = 0;
	public static final int ITMTYPE_MEDIC = 1;
	public static final int ITMTYPE_WEAPON = 2;
	public static final int ITMTYPE_EQUIPMENT = 3;
	public static final int ITMTYPE_OTHER = 4;

	public static class ItemTemplateGenerator {

		ItemTemplate itm;

		public ItemTemplateGenerator() {
			itm = new ItemTemplate();
			Gmud.getWp().add(itm);
			itm.setId(Gmud.getWp().size() - 1);
		}

		public ItemTemplateGenerator(int id) {
			while (Gmud.getWp().size() <= id) {
				Gmud.getWp().add(new ItemTemplate());
			}
			itm = Gmud.getWp().get(id);
			itm.setId(id);
		}


		// 设置物品名
		public ItemTemplateGenerator name(String s) {
			itm.setName(s);
// GmudGame.getInstance().xdata.put("ITEMID_"+itm.getName(), itm.getId());
			return this;
		}

		// 设置物品类型
		public ItemTemplateGenerator type(int id) {
			itm.setKind(id);
			return this;
		}

		// 设置物品子类型（装备位置）
		public ItemTemplateGenerator subtype(int id) {
			itm.setSubkind(id);
			return this;
		}

		// 可丢弃
		public ItemTemplateGenerator dropable() {
			itm.setA6(-1);
			return this;
		}

		// 设置物品描述
		public ItemTemplateGenerator desc(String s) {
			itm.setDes(s);
			return this;
		}

		// 设置物品售价
		public ItemTemplateGenerator cost(int value) {
			itm.setCost(value);
			return this;
		}

		//

		public ItemTemplateGenerator a3(int value) {
			itm.setA3(value);
			return this;
		}

		public ItemTemplateGenerator a4(int value) {
			itm.setA4(value);
			return this;
		}

		public ItemTemplateGenerator a5(int value) {
			itm.setA5(value);
			return this;
		}

		public ItemTemplateGenerator a6(int value) {
			itm.setA6(value);
			return this;
		}

		public ItemTemplateGenerator texture(int[] value) {
			for (int i = value[0]; i <= value[1]; ++i) {
				itm.texture.add(i);
			}
			return this;
		}


		public int id() {
			return itm.getId();
		}
	}


	public static final int ATTR_STR = 0;
	public static final int ATTR_AGI = 1;
	public static final int ATTR_WXG = 2;
	public static final int ATTR_BON = 3;
	public static final int ATTR_ATK = 4;
	public static final int ATTR_DEF = 5;
	public static final int ATTR_HIT = 6;
	public static final int ATTR_EVD = 7;
	public static final int ATTR_EXP = 8;
	public static final int ATTR_ADS = 9;
	public static final int ATTR_MAXHP = 10;
	public static final int ATTR_MAXFP = 11;

	public static final int ATTR_CRIT = 12;                 // 暴击率，每点数值为0.001
	public static final int ATTR_MULTI = 13;                // 连击率，每点数值为0.001

	public static final int ATTR_SPSTEAL = 14;              // 吸血比例（吸血大法），每点数值0.01

	public static final int ATTR_GENDER = 15;
	public static final int ATTR_FACTION = 16;


	public static final int XATTR_FACE = 0;
	public static final int XATTR_POT = 1;
	public static final int XATTR_FOOD = 2;
	public static final int XATTR_WATER = 3;


	public SkillModifier skill(int id) {
		return new SkillModifier(id);
	}

	static class SkillModifier {
		Skill skl;

		SkillModifier(int id) {
			if (Gmud.skill[id] == null) {
				Gmud.skill[id] = new Skill();
			}

			skl = Gmud.skill[id];
		}

		SkillModifier name(String s) {
			skl.name = s;

// GmudGame.getInstance().xdata.put("SKILLID_"+skl.name, skl.id);
			return this;
		}


		SkillModifier desc(String s) {
			skl.des = s;

			return this;
		}


		// 设置技能类型
		SkillModifier type(int id) {
// skl.kind = id;
			skl.pos = Skill.equip_pos[skl.kind];
			return this;
		}

		// 设置技能子类型（武器类型）
		SkillModifier subtype(int id) {
			skl.subkind = id;
			return this;
		}

		// 设置是否为npc专用技能（玩家非法获得会受到惩罚）
		SkillModifier npc_skill(boolean yes) {
			skl.npc_skill = yes;
			return this;
		}


		// 起始招式编号
		SkillModifier from(int id) {
			skl.zss = id;
			return this;
		}


		// 结束招式编号
		SkillModifier to(int id) {
			skl.zse = id;
			return this;
		}

		// 结束招式编号-1
		SkillModifier endbefore(int id) {
			skl.zse = id - 1;
			return this;
		}


	}


	/**
	 * 在读档前读取基本数据后调用此函数补充数据。
	 */
	public void exec() {

		preexec();

		SparseArray<String> words = new SparseArray<>();
		words.put(
				-1,
				"$n打了个哈哈：今天的天气真是，哈哈。/我什么也都不知道，就算知道也不说，打死你我也不说。/$n看了你一眼，转身又忙自己的事情去了。/没看到我在忙吗？你还是找别人CHAT去吧。/$n睁大眼睛望着你，显然不知道你在说什么。");


		npc(12).say("潘小莲的豆腐真好吃。",
				Game.getInstance().getAudio().newSound("voice_ximenguang_1.ogg"));
		npc(28).silent().say("这位客官，想做身衣服吗？",
				Game.getInstance().getAudio().newSound("voice_xiaocaifeng_1.ogg"));


		for (int i = 0; i < Gmud.getNpc().size(); i++) {
			Npc npc = npc(i);

			if (npc.saying.isEmpty()) {
				String say = words.get(i, words.get(-1));
				String says[] = say.split("/");
				for (String say1 : says) {
					npc.say(say1);
				}
			}
		}


		npc(37).sell(91).sell(92);
	}


	void preexec() {
		for (int i = 0; i < Gmud.getNpc().size(); i++) {

			for(Item j : Gmud.getNpc(i).inventory){
				if(j != null){
					for(int k = 0; k < Gmud.getNpc(i).equipments.length; k++){
						if(j.equals(Gmud.getNpc(i).equipments[k])){
							Gmud.getNpc(i).equipments[k] = j;
						}
					}

					j.setQuality(new Item.ItemQuality(j.x_quality));
				}

			}

//			if (Gmud.getNpc(i).items != null) {
//				for (int j : Gmud.getNpc(i).items) {
//					if (Gmud.contains(Gmud.getNpc(i).itemsckd, j)) {
//						Gmud.getNpc(i).carryandequip(j);
//					} else {
//						Gmud.getNpc(i).give(j);
//					}
//				}
//			}
//			if (Gmud.getNpc(i).itemsckd != null) {
//				for (int j : Gmud.getNpc(i).itemsckd) {
//					if (!Gmud.contains(Gmud.getNpc(i).items, j)) {
//						Item itm = Item.generateItem(j, -1);
//						itm.drop_rate = 0;
//						Gmud.getNpc(i).equip(itm);
//					}
//				}
//			}
		}
	}

	/**
	 * 合法性修正
	 */
	void validity_rectify() {
		Gmud.mc.fame = Gmud.format(Gmud.mc.fame, 0, 160);
		Gmud.mc.maxfp = Gmud.format(Gmud.mc.maxfp, 0, GameConstants.FP_LIMIT);
		Gmud.mc.setExp(Gmud.mc.exp);
		Gmud.mc.potential = Gmud.format(Gmud.mc.potential, 0, -1);
		Gmud.mc.gold = Gmud.format(Gmud.mc.gold, 0, -1);
		for (int i = 0; i < Gmud.mc.skills.length; i++) {
			Gmud.mc.skills[i] = Gmud.format(Gmud.mc.skills[i], 0, 255);
			if(Gmud.skill[i].npc_skill) Gmud.mc.skills[i] = 0;
		}
	}

	/**
	 * 兼容性修正
	 */
	void compatibility_rectify() {
// Gmud.mc.setSz(new int[StuntScreen.name.length]);
// Gmud.mc.setBuff(new int[10]); // 修复旧存档不能用新绝招问题（重置绝招长度）
		while (Gmud.mc.skills.length < Gmud.skill.length) {
			Gmud.mc.skills = Gmud.push_back(Gmud.mc.skills, 0);
		}

		while (Gmud.mc.skillsckd.length < 6) {
			Gmud.mc.skillsckd = Gmud.push_back(Gmud.mc.skillsckd, -1);
		}

		while (Gmud.mc.learning.length < Gmud.skill.length) {
			Gmud.mc.learning = Gmud.push_back(Gmud.mc.learning, 0);
			// 修复新增武功下标越界的问题
		}

		for (Npc npc : Gmud.getNpc()) {
			npc.rectify_equipments();
		}

		Gmud.mc.rectify_equipments();
	}

	/**
	 * 在读档后进入游戏前调用。
	 */
	public void after_process() {


		validity_rectify();
		setOldMCs();

//		npc(38).trigger4 = 6;

		Game.getData().init();
		IngameData.refresh();
		GmudMap.clearEvent(GameConstants.SPOUSE_PLACE);
		compatibility_rectify();

		if(!Gmud.mc.have(Gmud.findItem("郭襄的信").id))
			Event.refreshGuoxiang();

		switch (Gmud.paymentData.paymentStatus) {
			case PAID:
				npc(135).place(2, 18, 12);
				break;
			case TRIAL:
				if (++Game.getData().stat_start > (Gmud.DEBUG ? 1 : 7)) {
					npc(135).place(1, 12, 8);
				}
				break;
			case TRIAL2:
				npc(135).place(1, 12, 8);
				break;
			case ZERO:
				npc(135).place(2, 10, 7);
				break;
			default:
				break;

		}

	}

	/**
	 * 加载前代目
	 */
	public void setOldMCs() {
		for(int i = 0; i < 5; i++){
			map(46).setEvent(i+4, 4, -1);
		}
		for (int i = 0; i < Game.getData().getSyuume(); i++) {
			Npc oldmc = Game.getInstance().oldmc.get(i);

			int id = npc(oldmc)
					.look(-1, -1)
					.flag(Npc.FLAG_IMPORTANT)
					.flag(Npc.FLAG_NODROP)
					.introduction("")
					.id;

			map(46).npc(i + 4, 4, id);

			Gmud.getNpc(id).refresh();
		}
	}

	public Npc npc() {
		Npc t = new Npc();
		Gmud.getNpc().add(t);
		t.id = Gmud.getNpc().size() - 1;
		return t;
	}

	public Npc npc(Npc npc) {
		Gmud.getNpc().add(npc);
		npc.id = Gmud.getNpc().size() - 1;
		return npc;
	}

	public Npc npc(int id) {
		while (Gmud.getNpc().size() - 1 < id) {
			Npc t = new Npc();
			t.id = Gmud.getNpc().size();
			Gmud.getNpc().add(t);
		}

		return Gmud.getNpc(id);
	}

	public GmudMap map(int id) {
		return Gmud.maps[id];
	}


	/**
	 * 喵
	 */
	public Room() {

	}

}
